package ar.edu.utn.frre.sistop.simumem;

import java.util.ArrayList;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import ar.edu.utn.frre.sistop.simumem.common.Preferences;
import ar.edu.utn.frre.sistop.simumem.fragments.InstantChooserDialogFragment;
import ar.edu.utn.frre.sistop.simumem.fragments.InstantChooserDialogFragment.InstantChooserDialogListener;
import ar.edu.utn.frre.sistop.simumem.fragments.ResultPagerAdapter;
import ar.edu.utn.frre.sistop.simumem.fragments.StatisticsDialogFragment;
import ar.edu.utn.frre.sistop.simumem.logic.Simulador;
import ar.edu.utn.frre.sistop.simumem.model.Algoritmo;
import ar.edu.utn.frre.sistop.simumem.model.Memoria;
import ar.edu.utn.frre.sistop.simumem.model.Particion;
import ar.edu.utn.frre.sistop.simumem.model.Proceso;
import ar.edu.utn.frre.sistop.simumem.model.Resultado;

public class ResultsActivity extends ActionBarActivity implements OnPageChangeListener,
		InstantChooserDialogListener {

	private ViewPager mViewPager;
	private ResultPagerAdapter mAdapter;

	private ArrayList<Proceso> mProcesos;
	private ArrayList<Particion> mParticiones;
	private Memoria mMemoria;
	private Algoritmo mAlgoritmo;
	private Resultado mResultado;
	private Preferences mPreferences;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setPreferences(new Preferences(this));

		setContentView(R.layout.activity_results);

		mProcesos = getPreferences().getProcesos();
		mParticiones = getPreferences().getParticiones();
		mMemoria = new Memoria(mParticiones);

		switch (getPreferences().getAlgoritmoAsignacion()) {
		case 0:
			mAlgoritmo = Algoritmo.FirstFit;
			break;
		case 1:
			mAlgoritmo = Algoritmo.BestFit;
			break;
		case 2:
			mAlgoritmo = Algoritmo.WorstFit;
			break;
		}

		new SimularTask().execute();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.results, menu);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.action_jump_to:
			showInstantChooserDialog();
			break;
		case R.id.action_statistics:
			showStatisticsDialog();
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	private class SimularTask extends AsyncTask<Void, Long, Resultado> {

		@Override
		protected Resultado doInBackground(Void... params) {
			return Simulador.ParticionesFijas(mProcesos, new Memoria(mParticiones), mAlgoritmo);
		}

		@Override
		protected void onPostExecute(Resultado result) {
			mResultado = result;

			mViewPager = (ViewPager) findViewById(R.id.pager_results);
			mAdapter = new ResultPagerAdapter(ResultsActivity.this, result, mMemoria);
			mViewPager.setAdapter(mAdapter);
			mViewPager.setOnPageChangeListener(ResultsActivity.this);
		}

	}

	public Resultado getResultado() {
		return mResultado;
	}

	@Override
	public void onPageScrollStateChanged(int state) {
	}

	@Override
	public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
	}

	@Override
	public void onPageSelected(int position) {
		getSupportActionBar().setTitle("Resultado (t: " + position + ")");
	}

	public Preferences getPreferences() {
		return mPreferences;
	}

	public void setPreferences(Preferences mPreferences) {
		this.mPreferences = mPreferences;
	}
	
	public void showStatisticsDialog() {
		DialogFragment dialog = new StatisticsDialogFragment(mResultado, mProcesos);
		dialog.show(getSupportFragmentManager(), "StatisticsDialogFragment");
	}

	public void showInstantChooserDialog() {
		// Create an instance of the dialog fragment and show it
		DialogFragment dialog = new InstantChooserDialogFragment(mResultado.getEstados().size() - 1);
		dialog.show(getSupportFragmentManager(), "InstantChooserDialogFragment");
	}

	// The dialog fragment receives a reference to this Activity through the
	// Fragment.onAttach() callback, which it uses to call the following methods
	// defined by the NoticeDialogFragment.NoticeDialogListener interface
	@Override
	public void onDialogPositiveClick(DialogFragment dialog, int instante) {
		mViewPager.setCurrentItem(instante);
	}
}
